Файл: TextCalc.txt

Дата: 10.04.2014

1: * Словесный калькулятор. 
2: * Пример демонстрирует способ распознавания и интерпретации предложений на естественном языке. 
3: * Может выполнять арифметические действия (сложение, вычитание, умножение, деление)
4: * с двумя целыми положительными числами от нуля до девятьсот девяносто девяти.
5: * Примеры запросов: "Сколько будет сто двадцать пять вычесть тридцать один?",
6: * "помножь три на пятнадцать", "сложи семь и семьдесят пять"
7: * Программа КОНЦЕПТ, 09.05.2011, www.gendoc.ru
8:
9: присвоить ОБЛАСТЬ_КАТЕГОРИИ 1 ОБЛАСТЬ_ГИПОТЕЗЫ 2
10:
11: Инициализация_грамматики
12:
13: * Ввод предложения
16:   "помножь три на пятнадцать" "сложи семь и семьдесят пять" )
17:
18: >[ПРЕДЛОЖЕНИЕ]
19: строка отсечьПробелы ПРЕДЛОЖЕНИЕ $
20: строка строчные ПРЕДЛОЖЕНИЕ $  
21: строка коды ПРЕДЛОЖЕНИЕ $ "?;{}_'"
22: строка кСпискуСлов ПРЕДЛОЖЕНИЕ $
23:
24: * Формирование начальных гипотез
25: данные использовать [ОБЛАСТЬ_ГИПОТЕЗЫ]
26: для слово [ПРЕДЛОЖЕНИЕ]
27:   присвоить номер_слова [$НомерИтерации]
28:   если (вычислить являетсяЧислом $результат [слово] )    
29:     факт добавить "r;<гипотеза>;ЧИСЛО;[номер_слова];[номер_слова];0"
30:   иначе
31:     факт добавить "r;<гипотеза>;[слово];[номер_слова];[номер_слова];0"
32:         * Формирование гипотез по категориям слова
33:     данные использовать [ОБЛАСТЬ_КАТЕГОРИИ]
34:     для категория_слова (понятие всеНад $результат [слово] )  
35:       данные использовать [ОБЛАСТЬ_ГИПОТЕЗЫ]
36:       факт добавить "r;<гипотеза>;[категория_слова];[номер_слова];[номер_слова];0"
37:       данные использовать [ОБЛАСТЬ_КАТЕГОРИИ]
38:     следующий
39:     данные использовать [ОБЛАСТЬ_ГИПОТЕЗЫ]
40:   конец  
41: следующий
42:
43: данные использовать [ОБЛАСТЬ_ГИПОТЕЗЫ]
44: Интерпретация_предложения
45:
46: стоп
47:
48: * Интерпретация предложения
49:
50: функция Интерпретация_предложения
51: память локальный категории режим номер_числа \
52:   операция числ опер итог
53:
54: данные использовать [ОБЛАСТЬ_ГИПОТЕЗЫ]
55:
56: присвоить режим поиск номер_числа 0 операция ? итог ''
57: для [ПРЕДЛОЖЕНИЕ]
58:   факт сопоставитьМножество категории "r;<гипотеза>;[?рез];[$НомерИтерации];[$НомерИтерации];[?]"
59:   присвоить числ (Распознать [категории] _число: )
60:   присвоить опер (Распознать [категории] _опер:  )
61:
62:   если [опер]
63:     присвоить операция [опер] режим поиск
64:   иначе
65:     если [числ]
66:       если [режим] == число
67:         вычислить + "число[номер_числа]" $ [числ]
68:       иначе
69:         увеличить номер_числа
70:         присвоить "число[номер_числа][числ] режим число
71:       конец
72:     иначе
73:       присвоить режим поиск
74:     конец
75:   конец
76: следующий
77:
78: если [операция]
79:   если (память существует $результат число1 )
80:     если (память существует $результат число2 )
81:       выполнить "вычислить [операция] итог [число1] [число2]"
82:     конец
83:   конец
84: конец
85:
86: если [итог] == ''
87:   >Не знаю. :(
88: иначе
89:   >Ответ: [итог]
90: конец
91: возврат
92:
93: функция Распознать множество_строк префикс_строки
94:   память локальный рез длина
95:
96:   строка размер длина [префикс_строки]
97:   присвоить рез ''
98:   для [множество_строк]  
99:     если [рез] == ''
100:       если (строка копировать $результат [$ОбъектЦикла] 1 [длина] ) == [префикс_строки]  
101:         строка удалить рез [$ОбъектЦикла] 1 [длина]  
102:       конец
103:     конец  
104:   следующий
105:   присвоить $результат [рез]
106: возврат
107:
108: * Инициализация грамматики
109:
110: функция Инициализация_грамматики
111: данные использовать [ОБЛАСТЬ_КАТЕГОРИИ]
112: факт добавить \
113: i;ноль;_число:0 \
114: i;один;_число:1 \
115: i;два;_число:2 \
116: i;три;_число:3 \
117: i;четыре;_число:4 \
118: i;пять;_число:5 \
119: i;шесть;_число:6 \
120: i;семь;_число:7 \
121: i;восемь;_число:8 \
122: i;девять;_число:9 \
123: i;десять;_число:10 \
124: i;одиннадцать;_число:11 \
125: i;двеннадцать;_число:12 \
126: i;триннадцать;_число:13 \
127: i;четырнадцать;_число:14 \
128: i;пятнадцать;_число:15 \
129: i;шестнадцать;_число:16 \
130: i;семнадцать;_число:17 \
131: i;восемнадцать;_число:18 \
132: i;девятнадцать;_число:19 \
133: i;двадцать;_число:20 \
134: i;тридцать;_число:30 \
135: i;сорок;_число:40 \
136: i;пятьдесят;_число:50 \
137: i;шестьдесят;_число:60 \
138: i;семьдесят;_число:70 \
139: i;восемьдесят;_число:80 \
140: i;девяносто;_число:90 \
141: i;сто;_число:100 \
142: i;двести;_число:200 \
143: i;триста;_число:300 \
144: i;четыреста;_число:400 \
145: i;пятьсот;_число:500 \
146: i;шестьсот;_число:600 \
147: i;семьсот;_число:700 \
148: i;восемьсот;_число:800 \
149: i;девятьсот;_число:900 \
150: i;сложить;_опер:+ \
151: i;сложи;_опер:+ \
152: i;прибавить;_опер:+ \
153: i;прибавь;_опер:+ \
154: i;плюс;_опер:+ \
155: i;вычесть;_опер:- \
156: i;вычти;_опер:- \
157: i;минус;_опер:- \
158: i;отнять;_опер:- \
159: i;умножить;_опер:* \
160: i;умножь;_опер:* \
161: i;помножить;_опер:* \
162: i;помножь;_опер:* \
163: i;разделить;_опер:/ \
164: i;раздели;_опер:/ \
165: i;поделить;_опер:/ \
166: i;подели;_опер:/ \
167: i;_опер:+;_операция \
168: i;_опер:-;_операция \
169: i;_опер:*;_операция \
170: i;_опер:/;_операция
171: *данные показать
172:
173: возврат